package com.yxym.synchronized_;

public class Synchronized_ {
    public static void main(String[] args) {
        SellTicket03 sellTicket03 = new SellTicket03();
        new Thread(sellTicket03).start();//第一个线程窗口
        new Thread(sellTicket03).start();//第二个线程窗口
        new Thread(sellTicket03).start();//第三个线程窗口
    }
}

class SellTicket03 implements Runnable{
    private int ticketNums = 100;
    private boolean loop = true;//控制run方法变量...
    Object object = new Object();

    //同步方法（静态的）的锁为当前类本身
    //在静态代码块中，实现一个同步代码块
    /*
    public  synchronized static void m(){}锁加在SellTicket03.class
     */
    public  synchronized static void m(){
    }
    public static void m2(){
        synchronized (SellTicket03.class){
            System.out.println("00");
        }
    }

    /**
     * 锁在this对象
     * 也可以在代码块上synchronized，同步代码块，互斥锁还是this对象
     */
    public /*synchronized*/ void sell(){//同步方法，同一时刻，只能有一个线程来执行sell方法
        synchronized (this){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(ticketNums <= 0){
                System.out.println("售票结束...");
                loop = false;
                return ;
            }

            System.out.println("窗口"
                    + Thread.currentThread().getName()+
                    "售出一张票" + "剩余的票数=" + (ticketNums--));
        }
    }
    @Override
    public  void run() {
        while (loop){
            sell();//同步方法
        }
    }
}